import cv2 as cv
import numpy as np
from sklearn.decomposition import PCA

img =cv.imread('C:\\Users\\asus\\Pictures\\Camera Roll\\timg.jpg',1)

'''
     cvtColor(src, code[, dst[, dstCn]]) -> dst
    将图像从一种颜色空间转换为另一种颜色空间。
'''
img =cv.cvtColor(img,cv.COLOR_BGR2GRAY)

'''
    def threshold(src, thresh, maxval, type, dst=None):
    设置固定级别的阈值应用于多通道矩阵
	例如，将灰度图像变换二值图像，或去除指定级别的噪声，或过滤掉过小或者过大的像素点；
    Argument:
        src: 原图像
        dst: 目标图像
        thresh: 阈值
        type: 指定阈值类型；下面会列出具体类型；
        maxval: 当type指定为THRESH_BINARY或THRESH_BINARY_INV时，需要设置该值；
'''
ret,img = cv.threshold(img,127,255,cv.THRESH_BINARY)


'''
    检测物体的轮廓
    cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
    第一个参数是寻找轮廓的图像；
    第二个参数表示轮廓的检索模式，有四种（本文介绍的都是新的cv2接口）：
        cv2.RETR_EXTERNAL表示只检测外轮廓
        cv2.RETR_LIST检测的轮廓不建立等级关系
        cv2.RETR_CCOMP建立两个等级的轮廓，上面的一层为外边界，里面的一层为内孔的边界信息。如果内孔内还有一个连通物体，这个物体的边界也在顶层。
        cv2.RETR_TREE建立一个等级树结构的轮廓。
    第三个参数method为轮廓的近似办法
        cv2.CHAIN_APPROX_NONE存储所有的轮廓点，相邻的两个点的像素位置差不超过1，即max（abs（x1-x2），abs（y2-y1））==1
        cv2.CHAIN_APPROX_SIMPLE压缩水平方向，垂直方向，对角线方向的元素，只保留该方向的终点坐标，例如一个矩形轮廓只需4个点来保存轮廓信息
        cv2.CHAIN_APPROX_TC89_L1，CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
    cv2.findContours()函数返回两个值，一个是轮廓本身，还有一个是每的条轮廓对应属性。
'''
cnts,hierarchy=cv.findContours(img,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
print(hierarchy)


'''
    函数cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]])
    概述
    绘制轮廓线或者填充轮廓
    参数
    image:需要绘制轮廓的目标图像，注意会改变原图
    contours:轮廓点，上述函数cv2.findContours()的第一个返回值
    contourIdx:轮廓的索引，表示绘制第几个轮廓，-1表示绘制所有的轮廓
    color:绘制轮廓的颜色
    thickness:（可选参数）轮廓线的宽度，-1表示填充
    lineType:（可选参数）轮廓线型，包括cv2.LINE_4,cv2.LINE_8（默认）,cv2.LINE_AA,分别表示4邻域线，8领域线，抗锯齿线（可以更好地显示曲线）
    hierarchy:（可选参数）层级结构，上述函数cv2.findContours()的第二个返回值，配合maxLevel参数使用
    maxLevel:（可选参数）等于0表示只绘制指定的轮廓，等于1表示绘制指定轮廓及其下一级子轮廓，等于2表示绘制指定轮廓及其所有子轮廓
    offset:（可选参数）轮廓点的偏移量
'''
#创建白色幕布
temp = np.ones(cv.Canny(img,50,200).shape,np.uint8)*255
#画出轮廓：temp是白色幕布，contours是轮廓，-1表示全画，然后是颜色，厚度
cv.drawContours(temp,cnts,-1,(0,255,0),3)
cv.imshow("contours",temp)

cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
